/*----------------------------------------------------------
* FILE: ServiceFinder.java
* LOGICAL NAME: ServiceFinder
* PRODUCT: bila-framework
*----------------------------------------------------------
* MODIFICATIONS
* DATE Oct 8, 2011
* AUTHOR wjuarez
*----------------------------------------------------------
*/

package bila.framework.services;

import java.io.Serializable;
import java.util.List;

/**
 * @author WJuarez
 * <b>Created by </b>wjuarez
 * <b>for</b> bila-framework
 * <b>package</b> bila.framework.services
 * <b>on</b> Oct 8, 2011 1:03:13 PM
 * <b>Purpose</b> 
 * <p>
 *		Servicio dedicado para la creacion de consultas
 * </p>
 */
public interface ServiceFinder<Dto, Model, ModelId extends Serializable> {

	/**
	 * Metodo que realiza la busqueda ocupando
	 * como filtro todos los campos que no son nulos del objeto
	 * Dto que se pasa como parametro
	 * @param dto objeto que posee los campos para filtro de busqueda
	 * @return objeto de tipo List<Dto> con los registros que cumple la condicion de busqueda
	 * @throws Exception
	 */
	public List<Dto> find(Dto dto) throws Exception;
	
	/**
	 * Metodo que busca un registro en especifico ocupando
	 * su llave primaria como parametros de busqueda
	 * @param dto objeto que posee la llave primeria de la tabla
	 * @return objeto Dto con la informacion del registro recuperado
	 * @throws Exception
	 */
	public Dto findByKey(Dto dto) throws Exception;
	
	/**
	 * Metodo que recupera todos los registros de la tabla
	 * @return objeto de tipo List<Dto> con los registros de la tabla
	 * @throws Exception
	 */
	public List<Dto> getAll() throws Exception;
	
	/**
	 * Metodo que recupera informacion utilizando como filtro 
	 * los campos que no son de la llave ni que sean nulos del Dto
	 * @param dto objeto de tipo Dto con los parametros de busqueda
	 * @return objeto de tipo List<Dto> con los registros recuperados
	 * @throws Exception
	 */
	public List<Dto> getByExample(Dto dto) throws Exception;
	
	/**
	 * Metodo que realiza la busqueda utilizando la funcionalidad
	 * del metodo find de esta interfaz y ordenandolos segun el arreglo
	 * que se pasa como segundo parametro. Si el arreglo viene nulo
	 * no se ordena por ningun campo
	 * @param dto objeto de tipo Dto con los parametros de busqueda
	 * @param orders arreglo con los campos a utilizar para el ordenamiento
	 * @param orderType arreglo con el mismo numero del arreglo anterior que especifica
	 * 		  si el ordenamiento es ascendente o descendente
	 * @return objeto de tipo List<Dto> con los registros recuperados
	 * @throws Exception
	 */
	public List<Dto> findWithOrderBy(Dto dto, String[] orders, String[] orderType) throws Exception;
	
	/**
	 * Recupera todos los registros de la tabla ordenandolos
	 * por los parametros que se pasan como segundo parametro
	 * @param orders arreglo con los campos a utilizar para el ordenamiento
	 * @param orderType arreglo con el mismo numero del arreglo anterior que especifica
	 * 		  si el ordenamiento es ascendente o descendente
	 * @return objeto de tipo List<Dto> con los registros recuperados
	 * @throws Exception
	 */
	public List<Dto> getAllWithOrderBy(String[] orders, String[] orderType) throws Exception;
	
}
